package com.xiyun.f601t700;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/*
624. 数组列表中的最大距离
中等

给定 m 个数组，每个数组都已经按照升序排好序了。

现在你需要从两个不同的数组中选择两个整数（每个数组选一个）并且计算它们的距离。两个整数 a 和 b 之间的距离定义为它们差的绝对值 |a-b| 。

返回最大距离。

示例 1：

输入：[[1,2,3],[4,5],[1,2,3]]
输出：4
解释：
一种得到答案 4 的方法是从第一个数组或者第三个数组中选择 1，同时从第二个数组中选择 5 。
示例 2：

输入：arrays = [[1],[1]]
输出：0


提示：

m == arrays.length
2 <= m <= 105
1 <= arrays[i].length <= 500
-104 <= arrays[i][j] <= 104
arrays[i] 以 升序 排序。
所有数组中最多有 105 个整数。
 */
public class ArrDistance_624 {
    public static int resolve() {
        int[][] arrays = new int[][]{{1, 5}, {3, 4}};
        return new Solution().maxDistance(Arrays.stream(arrays).map(row -> Arrays.stream(row)
                .boxed()
                .collect(Collectors.toList())).collect(Collectors.toList()));
    }

    static class Solution {
        public int maxDistance(List<List<Integer>> arrays) {
            int last_min = arrays.get(0).get(0), last_max = arrays.get(0).get(arrays.get(0).size() - 1),
            min_val = arrays.get(1).get(0), max_val = arrays.get(1).get(arrays.get(0).size() - 1), min_idx = 0, max_idx = 0;
            for (int i = 0; i < arrays.size(); i++) {
                int cur_min = arrays.get(i).get(0), cur_max = arrays.get(i).get(arrays.get(i).size() - 1);
                if (cur_min < min_val) {
                    last_min = min_val;
                    min_val = cur_min;
                    min_idx = i;
                }
                if (cur_max > max_val) {
                    last_max = max_val;
                    max_val = cur_max;
                    max_idx = i;
                }
            }
            if (min_idx != max_idx) {
                return Math.abs(max_val - min_val);
            } else {
                return Math.max(Math.abs(max_val - last_min), Math.abs(min_val - last_max));
            }
        }
    }
}
